package main

import (
	"io/ioutil"
	"strings"
	"encoding/xml"
	"encoding/json"
	"./fsnotify"
	"net/http"
	"log"
	"os"
	"./ini"
	"time"
)

//Data 定义xml 外层解析结构体
// type Data struct {
// 	PentaCam PentaCamStruct `xml:"LS_900_PentaCam_Export"`
// 	FileName string	`json:"fileName"`
// 	RootPath string `json:"rootPath"`
// }

//Data 定义xml 外层解析结构体
type Data struct{
	Patient Patient `xml:"Patient" json:"patient"`
	Exam Exam `xml:"Exam" json:"exam"`
	FileName string	`json:"fileName"`
	RootPath string `json:"rootPath"`
}

//Patient 定义xml-2层解析结构体
type Patient struct{
	ID string `xml:"ID" json:"id"`
	LastName string `xml:"LastName" json:"lastName"`
	FirstName string `xml:"FirstName" json:"firstName"`
	Birthday string `xml:"Birthday" json:"birthday"`
	Gender string `xml:"Gender" json:"gender"`
}

//Exam 定义xml-2层解析结构体
type Exam struct{
	Time string `xml:"Time" json:"time"`
	EyeOD Eyes `xml:"Eye1" json:"eyeOD"`
	EyeOS Eyes `xml:"Eye" json:"eyeOS"`
}

//Eye 定义xml-2层解析结构体
type Eyes struct{
	MeasurementMode string `xml:"MeasurementMode" json:"measurementMode"`
	K1 string `xml:"K1" json:"k1"`
	K2 string `xml:"K2" json:"k2"`
	K1Axis string `xml:"K1Axis" json:"k1Axis"`
	N string `xml:"n" json:"n"`
	CCT string `xml:"CCT"`
	AD string `xml:"AD"`
	LT string `xml:"LT"`
	AL string `xml:"AL"`
	WTW string `xml:"WTW"`
	Pupil string `xml:"Pupil" json:"pupil"`
}

func main(){
	//CreatLog 日志文件生成器
	// 定义一个文件
    fileName := "xmlreader.log"
    logFile,err  := os.Create(fileName)
    defer logFile.Close()
    if err != nil {
        log.Fatalln("open file error !")
	}
	// 创建一个日志对象
    Info := log.New(logFile,"[Debug]",log.LstdFlags)
    //配置一个日志格式的前缀
	Info.SetPrefix("[Info]")
	// 创建一个ERR对象
    Err := log.New(logFile,"[Debug]",log.LstdFlags)
    //配置一个日志格式的前缀
    Err.SetPrefix("[Err]")
	
	//配置文件读取
	config, configErr := ini.Load("conf.ini")
	if configErr != nil {
		Err.Println("configErr:",configErr)
		return;
	}else{
		Info.Println("配置文件读取成功：folderDir="+config.Section("Main").Key("folderDir").String(),"interURL="+config.Section("Main").Key("interURL").String(),"deptId="+config.Section("Main").Key("deptId").String(),"client="+config.Section("Main").Key("client").String())
	}

	//文件夹路径
	SharefileDir := config.Section("Main").Key("folderDir").String()
	//后台接口路径
	InterURL := config.Section("Main").Key("interURL").String()
	//qita
	deptId := config.Section("Main").Key("deptId").String()
	client := config.Section("Main").Key("client").String()
	
	//创建一个监控对象
    watch, watchErr := fsnotify.NewWatcher()
	
    if watchErr != nil {
		Err.Println("watchErr:",watchErr)
    }
	
	//defer watch.Close();	//即使报错，监控不会关闭
	
	Info.Println("xml文件检测器已启动")

	//我们另启一个线程来处理监控对象的事件
	go func(){
        for {
			//添加要监控的对象，文件或文件夹
			watchPathErr := watch.Add(SharefileDir)

			//循环监控，若没有文件继续读取
			if watchPathErr != nil {
				continue	//暂未检测到文件夹
			}
			
			

            select {
           		case ev := <-watch.Events:
                {
					// Create 创建 Write 写入
                    if ev.Op&fsnotify.Create == fsnotify.Create {
						
						newFilePath := ev.Name	//新增文件路径
						
						//阻塞3s
						time.Sleep(time.Second * 1)
						
						//一次性读取文件
						cont , readFileErr := ioutil.ReadFile(newFilePath)
						if readFileErr != nil {
							Err.Println("readFileErr:",readFileErr)
							continue;
						}
	
						//转换编码方式
						// decoder := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewDecoder()
						// contUtf8, decodErr := decoder.Bytes(cont)
						// if decodErr != nil {
						// 	Err.Println("decodErr:",decodErr)
						//  continue
						// }
	
						//替换xml字符串中的UTF-16
						//str := strings.Replace(string(contUtf8), "UTF-16", "UTF-8", -1)
						
						//替换字符串中第一个eye标签值
						str1 := strings.Replace(string(cont), "<Eye", "<Eye1", 1)
						str := strings.Replace(str1, "/Eye", "/Eye1", 1)
	
						//反序列化xml
						data:= Data{}
						xmlRes := xml.Unmarshal([]byte(str), &data)
	
						if xmlRes != nil {
							Err.Println("xmlResError:",xmlRes)
							continue;
						}

						//增加字段
						data.FileName = ev.Name[strings.LastIndex(ev.Name,"\\")+1:]
						data.RootPath = ev.Name[:strings.LastIndex(ev.Name,"\\")]
						
						//json序列化
						jsonData,jsonErr := json.Marshal(&data)
	
						if jsonErr != nil {
							Err.Println("jsonErr:",jsonErr)
							continue;
						}

						//打印
						Info.Println("解析数据成功:",ev.Name)
						
						//测试
						Info.Println(string(jsonData))
						
						//发送到后台
						_, httpErr := http.Post(InterURL,
							"application/x-www-form-urlencoded",
							strings.NewReader("sendMsg="+string(jsonData)+"&fileName="+data.FileName+"&deptId="+deptId+"&client="+client))

						if httpErr != nil {
							Err.Println("httpErr:",httpErr)
						}else{
							Info.Println("已发送到后台")
						}
                    }
                }
            	case watchError := <-watch.Errors:
                {
                    Err.Println("watchError : ", watchError);
                    continue;		//即使报错，监控不会关闭
                }
            }
        }
	}();
	
	//循环阻塞
	select {};
} 